package com.xxl.job.executor.utils;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.executor.model.to.FtpParam;
import com.xxl.job.executor.utils.interfaces.FileNameGetter;
import com.xxl.job.executor.utils.interfaces.IsFileChecker;
import org.apache.commons.net.ftp.FTPFile;

public class FileFilterUtil {

    /**
     * 通用文件筛选方法
     */
    private static <T> List<T> filter(T[] allFiles, FtpParam param,
                                      FileNameGetter<T> nameGetter,
                                      IsFileChecker<T> fileChecker) {
        List<T> matchedFiles = new ArrayList<>();

        // 编译文件名正则表达式
        Pattern pattern = compilePattern(param);
        if (pattern == null) {
            return matchedFiles;
        }

        for (T file : allFiles) {
            // 只处理文件
            if (!fileChecker.isFile(file)) {
                continue;
            }

            String fileName = nameGetter.getFileName(file);
            // 正则表达式匹配
            Matcher matcher = pattern.matcher(fileName);
            if (matcher.matches()) {
                matchedFiles.add(file);
                XxlJobHelper.log("匹配文件: " + fileName);
            }
        }
        return matchedFiles;
    }

    /**
     * 编译正则表达式的通用方法
     */
    private static Pattern compilePattern(FtpParam param) {
        if (param.getFileNamePattern() == null || param.getFileNamePattern().isEmpty()) {
            return null;
        }
        try {
            return Pattern.compile(param.getFileNamePattern());
        } catch (Exception e) {
            XxlJobHelper.log("文件名正则表达式无效: " + param.getFileNamePattern() + ", 错误: " + e.getMessage());
            return null;
        }
    }

    /**
     * 筛选符合条件的FTP文件（调用通用方法）
     */
    public static List<FTPFile> ftpFileFilter(FTPFile[] allFiles, FtpParam param) {
        return filter(
                allFiles,
                param,
                FTPFile::getName,  // 方法引用：获取FTPFile文件名
                FTPFile::isFile    // 方法引用：判断是否为FTP文件
        );
    }

    /**
     * 筛选符合条件的本地文件（调用通用方法）
     */
    public static List<File> fileFilter(File[] allFiles, FtpParam param) {
        return filter(
                allFiles,
                param,
                File::getName,    // 方法引用：获取本地文件文件名
                File::isFile      // 方法引用：判断是否为本地文件
        );
    }
}
